home *** CD-ROM | disk | FTP | other *** search
- // menu_bar.cpp
-
- // still have a bug where click in menu bar outside a menu is interpreted
- // as opening a menu, so superclock doesn't get clicks in this situation
-
- // includes
- #include "menu_bar.h"
- #include "menu.h"
- #include "Finder_res.h"
- #include "app_constants.h"
-
- // constants
- const int top_margin = 1;
- const int left_margin = 2;
- const int menu_spacing = 0;
- const int click_time = 30; // ticks
-
- //
- // constructor
- //
- menu_bar::menu_bar(FormGadgetType* gadgetP, view* in_superview):
- view(&gadgetP->rect, in_superview)
- {
- m_open = false;
-
- int x = m_bounds.topLeft.x + left_margin;
- int y = m_bounds.topLeft.y;
- int height = m_bounds.extent.y - 1;
- int baseline = FntBaseLine() + top_margin;
- menu* new_menu;
-
- // should load menu bar resource, create menus based on it
- // for now, just load static menus
- new_menu = new menu(NULL, AppleBitmap, x, y, baseline, height, this);
- new_menu->add_item("About the Finder", cmd_about, 0);
- new_menu->add_item("-", 0, 0);
- new_menu->add_item("Alarm Clock", cmd_alarm_clock, 0);
- new_menu->add_item("Calculator", cmd_calculator, 0);
- new_menu->add_item("Chooser", cmd_chooser, 0);
- new_menu->add_item("Control Panel", cmd_control_panel, 0);
- new_menu->add_item("Key Caps", cmd_key_caps, 0);
- new_menu->add_item("Note Pad", cmd_note_pad, 0);
- new_menu->add_item("Scrapbook", cmd_scrapbook, 0);
- x += new_menu->get_width() + menu_spacing;
-
- new_menu = new menu("File", 0, x, y, baseline, height, this);
- new_menu->add_item("New Folder", cmd_new_folder, 'N');
- new_menu->add_item("Open", cmd_open, 'O');
- new_menu->add_item("Print", cmd_print, 'P');
- new_menu->add_item("Close Window", cmd_close_window, 'W');
- new_menu->add_item("-", 0, 0);
- new_menu->add_item("Get Info", cmd_get_info, 'I');
- new_menu->add_item("Duplicate", cmd_duplicate, 'D');
- x += new_menu->get_width() + menu_spacing;
-
- new_menu = new menu("Edit", 0, x, y, baseline, height, this);
- new_menu->add_item("Undo", cmd_undo, 'Z');
- new_menu->add_item("-", 0, 0);
- new_menu->add_item("Cut", cmd_cut, 'X');
- new_menu->add_item("Copy", cmd_copy, 'C');
- new_menu->add_item("Paste", cmd_paste, 'V');
- new_menu->add_item("Clear", cmd_clear, 0);
- new_menu->add_item("-", 0, 0);
- new_menu->add_item("Show Clipboard", cmd_show_clipboard, 0);
- x += new_menu->get_width() + menu_spacing;
-
- new_menu = new menu("View", 0, x, y, baseline, height, this);
- x += new_menu->get_width() + menu_spacing;
- new_menu->add_item("as Small Icons", cmd_view_as_sm_icon, 0);
- new_menu->add_item("as Icons", cmd_view_as_icon, 0);
- new_menu->add_item("as List", cmd_view_as_list, 0);
-
- new_menu = new menu("Special", 0, x, y, baseline, height, this);
- x += new_menu->get_width() + menu_spacing;
- new_menu->add_item("Empty Trash", cmd_empty_trash, 0);
- new_menu->add_item("-", 0, 0);
- new_menu->add_item("Sleep", cmd_sleep, 0);
- new_menu->add_item("Restart", cmd_restart, 0);
- new_menu->add_item("Shut Down", cmd_shutdown, 0);
- }
-
- //
- // destructor
- //
- menu_bar::~menu_bar() {
- // do nothing
- }
-
- //
- // click()
- //
- // override here in order to catch pen clicks when menu is open
- Boolean
- menu_bar::click(int x, int y) {
- Boolean handled = false;
-
- if (m_open==false) {
- handled = view::click (x, y);
- } else {
- handled = click_self (x, y);
- }
-
- return handled;
- }
-
-
- #pragma mark -
-
- //
- // draw_self()
- //
- void
- menu_bar::draw_self() {
- RectangleType r;
- PointType start, end;
-
- // set up rect
- RctCopyRectangle (&m_bounds, &r);
- r.extent.y--;
-
- // erase rect
- WinEraseRectangle (&r, 0);
-
- // set up line
- start.x = r.topLeft.x;
- start.y = r.topLeft.y + r.extent.y;
- end.x = start.x + r.extent.x;
- end.y = start.y;
-
- // draw line
- WinDrawLine (start.x, start.y, end.x, end.y);
- }
-
- //
- // click_self()
- //
- Boolean
- menu_bar::click_self(int x, int y) {
- Boolean pen_down;
- short new_x, new_y;
- UInt32 now = TimGetTicks();
- UInt32 timer = now + click_time;
-
- EvtGetPen ( &new_x, &new_y, &pen_down );
- while (pen_down==true) {
- still_down(new_x, new_y);
- EvtGetPen ( &new_x, &new_y, &pen_down );
- }
-
- // keep menu open for short pen taps
- now = TimGetTicks();
- if ( (now < timer) && RctPtInRectangle( new_x, new_y, &m_bounds ) ) {
- m_open = true;
- } else {
- pen_up(new_x, new_y);
- m_open = false;
- }
-
- return true;
- }
-
-